﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Vigenere.Models
{
    public class MyFunctions
    {
        /// <summary>
        /// 明文
        /// </summary>
        public string Plaintext { get; set; }
        /// <summary>
        /// 密文
        /// </summary>
        public string Ciphertext { get; set; }
        /// <summary>
        /// 密钥
        /// </summary>
        public string Key { get; set; }

        /// <summary>
        /// 加密函数
        /// </summary>
        public void Encrypt(string key)
        {
            //把秘钥转换成字符型数组
            char[] keys = Key.ToCharArray();
            //把明文字符串转换成字符型数组，并且去除其中的空格
            char[] plaintext = Plaintext.Replace(" ", "").ToCharArray();
            //建立一个链表用来存入密文
            List<char> ciphertext = new List<char>();
            //对明文中的每个字符，进行处理
            for(int i = 0; i < plaintext.Length; i++)
            {
                //序数对Key的长度取余，对应数字就能进行处理
                int k = i%(Key.Length);
                //对明文进行加密
                ciphertext.Add((char)(((changeSeq(plaintext[i]) + changeSeq(keys[k]))%26 +65)));
                if (k == 3)
                    ciphertext.Add(' ');
            }
            //将ciphertext的char链表变成
            Ciphertext=new string(ciphertext.ToArray());

        }
        /// <summary>
        /// 解密函数
        /// </summary>
        public void Decrypt(string key)
        {
            //把秘钥转成字符型数组
            char[] keys = Key.ToCharArray();
            //建立一个字符型数组存入解密秘钥
            //把密文字符串转换成字符型数组，并去掉其中的空格
            char[] ciphertext = Ciphertext.Replace(" ", "").ToCharArray();
            //建立一个字符型链表用来存入密文
            List<char> plaintext = new List<char>();
            //遍历密文
            for(int i = 0; i < ciphertext.Length; i++)
            {
                //对i进行对密钥长度的取余
                int k = (i%(Key.Length));
                //如果密文减去密钥>=0，那就直接返回该序数+97成为明文
                //如果小于0加上26就可以了
                if ((changeSeq2(ciphertext[i]) - changeSeq(keys[k])) >= 0)
                {
                    ciphertext[i] = (char)(changeSeq2(ciphertext[i]) - changeSeq(keys[k])+97);  
                }
                else
                    ciphertext[i] = (char)(changeSeq2(ciphertext[i]) + 26 - changeSeq(keys[k])+97);
            }
            //把得到的明文以string形式赋给Plaintext
            Plaintext=new string(ciphertext.ToArray());
        }

        /// <summary>
        /// 用于把输入的小写字母返回0-25的序列
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        
        private int changeSeq(char ch)
        {
            return ch - 'a';
        }
        /// <summary>
        /// 用于把输入的大写字母返回0-25序列
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        private int changeSeq2(char ch)
        {
            return ch - 'A';
        }

        


    }
}
